<?php
/*
Plugin Name: WP GMaps Entry
Plugin URI: http://code.google.com/p/wp-gmaps-entry/
Description: ktai_entryにgmaps表示構文を追加する。当プラグインを使用する為には、ktai_entryが必要です。(Only for WordPress 2.5+)
Version: 0.3
Author: Tatsuya Fukata
Author URI: http://fukata.org
*/
define('WPGE_SET_MAP_LAT', 'Lat:');
define('WPGE_SET_MAP_LNG', 'Lon:');
define('WPGE_MAPS_API_KEY', 'your maps api key.');
define('WPGE_MAP_WIDTH', 400);
define('WPGE_MAP_HEIGHT', 400);
define('WPGE_MAP_ZOOM', 16);

/**
 * ktai_entryから投稿された場合にGMapsコードを挿入する。
 * @param $post_name
 * @param $contents
 * @return unknown_type
 */
function wpge_do_filter_post_ktai_entry($post_name, &$contents) {
	
	$latMatches = null;
	$lonMatches = null;
	// Lat
	if (preg_match('/' . preg_quote(WPGE_SET_MAP_LAT, '/') . '(.*)$/m', $contents->text, $latMatches)) {
	}
	// Lon
	if (preg_match('/' . preg_quote(WPGE_SET_MAP_LNG, '/') . '(.*)$/m', $contents->text, $lonMatches)) {
	}
	
	if (wpge_is_gps_point($latMatches[1]) && wpge_is_gps_point($lonMatches[1])) {
		$lat = $latMatches[1];
		$lon = $lonMatches[1];
		$mapHtml = "\n".'[map lat='.$lat.' lon='.$lon.']';
		// 置換対象文字列を削除
		$contents->text = preg_replace('/' . preg_quote(WPGE_SET_MAP_LAT, '/') . '(.*)\n?/m', '', $contents->text);
		$contents->text = preg_replace('/' . preg_quote(WPGE_SET_MAP_LNG, '/') . '(.*)\n?/m', '', $contents->text);
		
		$contents->text .= $mapHtml;
	}
	return $post_name;
}

/**
 * GPSポイントとして正しい値かどうか判定を行う。
 * @param unknown_type $value
 * @return unknown_type
 */
function wpge_is_gps_point($value) {
	if (is_string($value) && is_numeric($value)) {
		$value = floatval($value);
	} else if (is_numeric($value)) {
		$value = floatval($value);
	} else {
		return false;
	}
	
	if (!is_float($value)) {
		return false;
	}
	
	return true;
}

/**
 * 
 * @param unknown_type $content
 * @return unknown_type
 */
function wpge_do_insert_gmap_code($atts, $content=null) {
	global $id;
	
	// デフォルト値の設定
	$atts = wpge_code_parse($atts);
//	$option = wpge_code_parse($content);
//	var_dump($option);
	
	// HTML挿入コードの生成
	$mapHtml = '';
	$mapHtml .= '<div id="map-'.$id.'" style="width:'.$atts['width'].'px;height:'.$atts['height'].'px"></div>'."\n";
	$mapHtml .= '<script type="text/javascript"><!--'."\n";
	$mapHtml .= 'var map = new GMap2(document.getElementById("map-'.$id.'"));'."\n";
	$mapHtml .= 'var center = new GLatLng('.$atts['lat'].', '.$atts['lon'].');'."\n";
	$mapHtml .= 'map.setCenter(center, '.$atts['zoom'].');'."\n";
	$mapHtml .= 'map.addOverlay(new GMarker(center));'."\n";
	$mapHtml .= '//-->'."\n";
	$mapHtml .= '</script>'."\n";
	$mapHtml .= '<noscript>'."\n";
	$mapHtml .= '<div class="map"><img src="http://maps.google.com/staticmap?center='.$option->lat.','.$option->lon.'&'.
					'zoom='.$atts['zoom'].'&size='.$atts['width'].'x'.$atts['height'].'&maptype=mobile&'.
					'markers='.$atts['lat'].','.$atts['lon'].'&key='.WPGE_MAPS_API_KEY.'&sensor=false"/></div>'."\n";
	$mapHtml .= '</noscript>'."\n";
	
	return $mapHtml;
}

/**
 * GMap挿入コードを解析する。
 * @return unknown_type
 */
function wpge_code_parse($atts) {
	$atts = shortcode_atts(array(
		'lat'=>null,
		'lon'=>null,
		'zoom'=>WPGE_MAP_ZOOM,
		'width'=>WPGE_MAP_WIDTH,
		'height'=>WPGE_MAP_HEIGHT,
	), $atts);
	return $atts;
}

/**
 * 挿入コードの値を取得する。
 * @param unknown_type $matches
 * @param unknown_type $key
 * @param unknown_type $default
 * @param unknown_type $regex
 * @return unknown_type
 */
function wpge_get_option($matches, $key, $default=null, $regex=null) {
	$value = $default;
	for ($i=0; $i<count($matches); $i++) {
		if ($matches[$i]==$key) {
			if ($i+1<count($matches) && ($regex==null || preg_match('/'.$regex.'/',$matches[$i+1]))) {
				$value = $matches[$i+1];
			}
		}
	}
	return $value;
}

add_filter('post_name/ktai_entry.php', 'wpge_do_filter_post_ktai_entry',10,3);
add_shortcode('map', 'wpge_do_insert_gmap_code');
?>